/*Opciones de Cabecera*/
header{ package pl.equipo13.p6; }
/* Analizador Sintactico */
class AnasintC extends Parser;
options{
	k = 4;
}

entrada: (bucle | funcion) EOF;
funcion: tipo_dato IDENT APARENTESIS VOID CPARENTESIS ALLAVE (instruccion)* CLLAVE;
bucle: WHILE APARENTESIS exp CPARENTESIS ALLAVE (instruccion)* CLLAVE;
instruccion: asignacion | condicional | declaracion | bucle | llamada;
cond_arit: variable OPERADORCOMPARAR variable IFARIT variable DOSPUNTOS variable; 
declaracion: tipo_dato IDENT (COMA IDENT)*  ((IGUAL) exp)? SEPARADOR;
asignacion: IDENT IGUAL ( exp | cond_arit) SEPARADOR;
llamada: IDENT APARENTESIS argumentos CPARENTESIS SEPARADOR;
argumentos: (variable | CADENA)? (COMA (variable | CADENA))*;
condicional: IF APARENTESIS exp CPARENTESIS instruccion | if_comp;
if_comp: ALLAVE (instruccion)* (BREAK SEPARADOR)? CLLAVE;

exp: (NEGADO | CAMBIOSIGNO)? exp_sr (OPERADORCOMPARAR exp_sr)?;
exp_sr: exp_mult (OPERADORSUMRES exp_mult)*;
exp_mult: exp_base (OPERADORMULDIV exp_base)*;
exp_base: variable | APARENTESIS exp_base CPARENTESIS;

variable: IDENT | LIT_REAL | LIT_ENTERO | CARACTER;

tipo_dato: VOID | INT | CHAR | FLOAT;